//这个版本将进行缓存的优化，还有读取className的优化，看是否能进一步的提高效率.
//优化来优化去，感觉都影响不大啊！并不能提高多少效率。
//所以目前就这样吧1不在这上面在浪费时间了 
var StringUtil = {
	entity:{
			"&": '&amp;',
			"<":  '&lt;',
			">":  '&gt;'
	},
	filterString:function(str){
		return String(str).replace(/[&|<|>]/g,
			function (a) {
			    return StringUtil.entity[a];
			}
		);
	}
}

var AdapterRegistry = function(/*Boolean?*/ returnWrappers){
	this.pairs = [];
	this.returnWrappers = returnWrappers || false; // Boolean
}
AdapterRegistry.prototype = {
	register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){
		this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]);
	},
	match: function(/* ... */){
		for(var i = 0; i < this.pairs.length; i++){
			var pair = this.pairs[i];
			if(pair[1].apply(this, arguments)){
				if((pair[3])||(this.returnWrappers)){
					return pair[2];
				}else{
					return pair[2].apply(this, arguments);
				}
			}
		}
		throw new Error("No match found");
	},
	unregister: function(name){
		for(var i = 0; i < this.pairs.length; i++){
			var pair = this.pairs[i];
			if(pair[0] == name){
				this.pairs.splice(i, 1);
				return true;
			}
		}
		return false;
	}
}
var handlers = new AdapterRegistry(true);

//list中的字符串替换方式
var listRepl = function(name,value,bean){
	bean.set(name,StringUtil.filterString(value));
}

//obj,map,数组等方式字符串替换方式
var objRepl = function(name,value,bean){
	bean[name] = StringUtil.filterString(value);
}

handlers.register("other",function(value){
	//由于现在的对象不可能是函数，或者是class属性了,因为用了getgetDeclaredFields方法，所以下面的判断可以省略了
	//只需要判断是否为空就行了啊
	//var matched = !value || (typeof value !== 'object') || (getClassName(value) == 'java.lang.Class');
	return !value;
},{
	filter: function(){
		return;
	}
});

var matchReg = {
	obj:/(^com\.tianji)|(^leoner)/,
	list:/^java\.util\..*List$/,
	map:/^java\.util\..*Map$/,
	array:/^\[L.*/
}
handlers.register("object",function(value){
	var name = getClassName(value);
//	return name.indexOf("com.tianji") > -1 || name.indexOf("leoner") > -1;
	return matchReg.obj.test(name);
},{
	filter: function(name,value,bean){
		//传递进来name是属性的名称,value为属性对应的值,bean为name所属于的对象
		//专门查找对象的属性，通过这种优化，速度快了2/3，看来多了大量没有必要的判断，是挺影响速度的。
		var fields = value.getClass().getDeclaredFields();
		for(var index in fields){
			var field = fields[index];
			var new_value = value[field.getName()];		
			handlers.match(new_value).filter(field.getName(),new_value,value,objRepl);
		}
//		for(var attr in value){
//			var new_value = value[attr];
//			handlers.match(new_value).filter(attr,new_value,value,objRepl);
//		}
		return;
	}
});
handlers.register("string",function(value){
	 return (getClassName(value) == 'java.lang.String');
},{
	filter: function(name,value,bean,replHandler){
		replHandler.apply(this,arguments);
	}
});

handlers.register("list",function(value){
	var name = getClassName(value);
//	return name.indexOf("java.util") == 0 && name.indexOf("List") > 0;
	return matchReg.list.test(name);
},{
	filter: function(name,value,bean){
		println("list filter->"+name);
		for(var i=0;i<value.size();i++){
			handlers.match(value.get(i)).filter(i,value.get(i),value,listRepl);
		}
	}
})
handlers.register("map",function(value){
	var name = getClassName(value);
//	return name.indexOf("java.util") == 0 && name.indexOf("Map") > 0;
	return matchReg.map.test(name);
},{
	filter: function(name,value,bean){
		println("map filter");
		var values = value.values();
		for(var i=0;i<values.size();i++){
			handlers.match(values.get(i)).filter(name,values.get(i),value,objRepl);
		}
	}
})

handlers.register("array",function(value){
	var name = getClassName(value);
	return matchReg.array.test(name);
},{
	filter: function(name,value,bean){
//		for(var index in value){
//			var new_value = value[index];
//			handlers.match(new_value).filter(index,new_value,value,objRepl);
//		}
		for(var i=0,len=value.length;i<len;i++){
			var new_value = value[i];
			handlers.match(new_value).filter(i,new_value,value,objRepl);
		}
	}
})

//这个方法是入口方法
function filterString(bean){
	//如果是
	println("begin---------------------");
	handlers.match(bean).filter("",bean,null);
	
}
function testLoop(list){
	for(var i=0;i<list.size();i++){
		list.set(i,StringUtil.filterString(list.get(i)));
	}
}
function getClassName(value){
	return String(value.getClass().name);
}

function testGetObjAttr1(obj){
	for(var i=0;i<obj.size();i++){
		var value = obj.get(i);
		var fields = value.getClass().getDeclaredFields();
		println(fields.length);
		for(var index in fields){
			var field = fields[index];
			var new_value = value[field.getName()];		
		}
	}
}

var classInfoCache = {
	cache:{},
	getInfo:function(clazz){
		var cl = this.cache[clazz];
		if(!cl){
			var fields = clazz.getDeclaredFields();
			this.cache[clazz] = fields;
			return fields;
		}
	}	
}
function testGetObjAttr2(obj){
	for(var i=0;i<obj.size();i++){
		var value = obj.get(i);
		var fields = classInfoCache.getInfo(value.getClass());
		
		for(var index in fields){
			var field = fields[index];
			var new_value = value[field.getName()];		
		}
	}
}


